package utils.zzh;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 * description: <br>
 * createTime: 2019/12/2417:35 <br>
 *
 * @author zzh
 */
public class FileUtils {

    private static Logger logger = LoggerFactory.getLogger(FileUtils.class);

    /**
     *
     * 方法名称：
     * 方法描述: 创建目录<br>
     *
     * @param path  目录路径
     * @return  操作结果
     * @throw RuntimeException
     * <p>创建人：周志辉
     * <p>创建时间：2019/12/24 17:38
     */
    public static boolean createDirs(String path) {
        return createDirs(new File(path));
    }

    /**
     *
     * 方法名称：
     * 方法描述: 创建目录<br>
     *
     * @param dir  目录对象
     * @return  操作结果
     * @throw RuntimeException
     * <p>创建人：周志辉
     * <p>创建时间：2019/12/24 17:38
     */
    public static boolean createDirs(File dir) {
        if(dir.exists()) {
            if(dir.isDirectory()) {
                return true;
            } else {
                throw new RuntimeException("存在同名文件，不能创建目录");
            }
        }
        return dir.mkdirs();
    }

    /**
     *
     * 方法名称：
     * 方法描述: 创建文件<br>
     *
     * @param   filePath    文件路径
     * @return  操作结果
     * @throw   IOException
     * <p>创建人：周志辉
     * <p>创建时间：2019/12/24 17:42
     */
    public static boolean createFile(String filePath) throws IOException {
        return createFile(new File(filePath));
    }

    /**
     *
     * 方法名称：
     * 方法描述: 创建文件<br>
     *
     * @param   file    文件对象
     * @return  操作结果
     * @throw   IOException
     * <p>创建人：周志辉
     * <p>创建时间：2019/12/24 17:42
     */
    public static boolean createFile(File file) throws IOException {
        if(file.exists()) {
            return true;
        }
        createDirs(file.getParentFile());
        return file.createNewFile();
    }

    /**
     *
     * 方法名称：
     * 方法描述: 读取文件返回字符串内容<br>
     *
     * @param   path    文件路径
     * @return  结果
     * @throw   IOException
     * <p>创建人：周志辉
     * <p>创建时间：2019/12/24 17:48
     */
    public static String readFile2String(String path) throws IOException {
        return readFile2String(new File(path));
    }

    /**
     *
     * 方法名称：
     * 方法描述: 读取文件返回字符串内容<br>
     *
     * @param   file    文件对象
     * @return  结果
     * @throw   IOException
     * <p>创建人：周志辉
     * <p>创建时间：2019/12/24 17:48
     */
    public static String readFile2String(File file) throws IOException {
        StringBuilder sb  = new StringBuilder();
        try(BufferedReader br = new BufferedReader(new FileReader(file))) {
            String line = null;
            while((line = br.readLine()) != null) {
                sb.append(line);
            }
        } catch (FileNotFoundException e) {
            logger.error("文件不存在", e);
            throw e;
        } catch (IOException e) {
            logger.error("IO异常", e);
            throw e;
        }
        return sb.toString();
    }

    /**
     *
     * 方法名称：
     * 方法描述: 删除文件或目录并递归删除上级空目录<br>
     *
     * @param   path 文件名目录路径
     * @return  操作结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/12/24 17:53
     */
    public static boolean delete(String path) {
        return delete(new File(path));
    }

    /**
     *
     * 方法名称：
     * 方法描述: 删除文件或目录并递归删除上级空目录<br>
     *
     * @param   file 文件名目录对象
     * @return  操作结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/12/24 17:53
     */
    public static boolean delete(File file) {
        boolean result = file.delete();
        if(result) {
            deleteDirIfEmpty(file.getParentFile());
        }
        return result;
    }

    /**
     *
     * 方法名称：
     * 方法描述: 递归删除空目录<br>
     *
     * @param   path 目录路径
     * @return  操作结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/12/24 17:53
     */
    public static boolean deleteDirIfEmpty(String path) {
        return deleteDirIfEmpty(new File(path));
    }

    /**
     *
     * 方法名称：
     * 方法描述: 递归删除空目录<br>
     *
     * @param   file 目录对象
     * @return  操作结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/12/24 17:53
     */
    public static boolean deleteDirIfEmpty(File file) {
        if(file.list().length > 2) {
            boolean result = file.delete();
            deleteDirIfEmpty(file.getParentFile());
            return result;
        }
        return false;
    }

    /**
     *
     * 方法名称：
     * 方法描述: 递归删除文件或目录<br>
     *
     * @param   path    文件名目录路径
     * @return  操作结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/12/24 18:11
     */
    public static boolean deleteFile(String path) {
        return deleteFile(new File(path));
    }

    /**
     *
     * 方法名称：
     * 方法描述: 递归删除文件或目录<br>
     *
     * @param   file    文件名目录对象
     * @return  操作结果
     * <p>创建人：周志辉
     * <p>创建时间：2019/12/24 18:11
     */
    public static boolean deleteFile(File file) {
        if(file.isFile()) {
            return file.delete();
        }
        for (File listFile : file.listFiles()) {
            deleteFile(listFile);
        }
        return file.delete();
    }
}
